﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WebService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class ServiceContract : IServiceContract
    {
        #region Atributos
        private bool _IsError;
        private string _ErrorMessage;
        #endregion 

        #region Constructor
        public ServiceContract()
        {
            _IsError = false;
            _ErrorMessage = "";
        }
        #endregion

        #region Operaciones de contrato
        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cliente que está ingresando en el sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del cliente</param>
        /// <param name="password">Contraseña del cliente</param>
        /// <returns>Retorna la cuenta auxiliar asociada a ese cliente (como información)</returns>
        public FinanSoft.Entities.AuxiliarAccount LogIn(string username, string password, string company)
        {
            FinanSoft.Entities.AuxiliarAccount aux = FinanSoft.BusinessLayer.WebServiceController.GetInstance().LogIn(username, password, company, OperationContext.Current.SessionId);
            if (aux == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return aux;
        }

        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// vendedor que está ingresando en el sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del vendedor</param>
        /// <param name="password">Contraseña del vendedor</param>
        /// <returns>Indica si la autenticación fue exitosa o no</returns>
        public bool LogInSalesman(string username, string password, string company)
        {
            return FinanSoft.BusinessLayer.WebServiceController.GetInstance().LogInSalesman(username, password, company, OperationContext.Current.SessionId);
        }


        /// <summary>
        /// Método que se encarga de obtener las monedas disponibles en el sistema
        /// </summary>
        /// <returns>Retorna la lista de Monedas</returns>
        public List<FinanSoft.Entities.Currency> GetCurrencies()
        {
            List<FinanSoft.Entities.Currency> currencies = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetCurrencies(OperationContext.Current.SessionId);
            if (currencies.Count == 0)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return currencies;
        }

        /// <summary>
        /// Método que se encarga de obtener las bodegas registradas en el sistema
        /// </summary>
        /// <returns>Retorna la lista de objetos bodega</returns>
        public List<FinanSoft.Entities.StoreRoom> GetStoreRooms()
        {
            List<FinanSoft.Entities.StoreRoom> storeRooms = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetStoreRooms(OperationContext.Current.SessionId);
            if (storeRooms == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return storeRooms;
        }

        /// <summary>
        /// Método que se encarga de obtener todos los artículos que hay en el sistema
        /// además de su información: bodega en donde está, el stock disponible, etc...
        /// </summary>
        /// <returns></returns>
        public List<FinanSoft.Entities.Item> GetItems()
        {
            List<FinanSoft.Entities.Item> items = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetItems(OperationContext.Current.SessionId);
            if (items == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return items;
        }

        /// <summary>
        /// Método que se encaga de obtener el impuesto por defecto para un artículo
        /// </summary>
        /// <returns>Retorna un objeto Impuesto con su respectiva información</returns>
        public FinanSoft.Entities.Tax GetDefaultTax()
        {
            FinanSoft.Entities.Tax tax = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetDefaultTax(OperationContext.Current.SessionId);
            if (tax == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return tax;
        }

        /// <summary>
        /// Método que se encarga de guardar el pedido del cliente como una orden de venta de la empresa
        /// </summary>
        /// <param name="idAuxiliarAccount">Id de la cuenta auxiliar asociada al cliente que realiza el pedido</param>
        /// <param name="postingDate">Fecha de emisión del pedido</param>
        /// <param name="deliveryExpDate">Fecha de vencimiento dl pedido</param>
        /// <param name="idMoneda">Moneda en que se hizo el pedido</param>
        /// <param name="amountBeforeTax">Monto antes de impuesto</param>
        /// <param name="taxAmount">Monto de impuestos</param>
        /// <param name="totalAmount">Monto después de impuesto</param>
        /// <param name="details">Lista de artículos que van en el documento</param>
        /// <returns>Retorna si la operación tuvo éxito o no</returns>
        public bool SaveOrderDocument(int idAuxiliarAccount, DateTime postingDate, DateTime deliveryExpDate, int idMoneda, double amountBeforeTax, double taxAmount, double totalAmount, List<FinanSoft.Entities.DocDetail> details)
        {
            bool noErrror = FinanSoft.BusinessLayer.WebServiceController.GetInstance().SaveOrderDocument(idAuxiliarAccount, postingDate, deliveryExpDate, idMoneda, amountBeforeTax, taxAmount, totalAmount, details, OperationContext.Current.SessionId);
            if (!noErrror)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return noErrror;
        }
        
        /// <summary>
        /// Obtiene los reportes de venta orientados a cliente-artículo
        /// </summary>
        /// <param name="auxId">Id de la cuenta auxiliar del cliente</param>
        /// <param name="itemId">Id del artículo</param>
        /// <returns>Información de reporte, uno por cada cliente y artículo. Si algún artículo nunca ha sido comprado por un cliente
        /// en específico, no se incluye el reporte de cliente-artículo para este caso particular.</returns>
        public FinanSoft.Entities.SaleReport[] GetSaleReport(int auxId, int itemId)
        {
            FinanSoft.Entities.SaleReport[] saleReports = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetSaleReport(auxId, itemId, OperationContext.Current.SessionId);
            if (saleReports == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return saleReports;
        }

        /// <summary>
        /// Obtiene las cuentas auxiliares de todos los clientes
        /// </summary>
        /// <returns></returns>
        public FinanSoft.Entities.AuxiliarAccount[] GetClients()
        {
            FinanSoft.Entities.AuxiliarAccount[] clientAccounts = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetClients(OperationContext.Current.SessionId);
            if (clientAccounts == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return clientAccounts;
        }

        /// <summary>
        /// Método que se encaga de revisar si hubo error o no
        /// </summary>
        /// <returns>Retorna un booleano de si hubo error o no</returns>
        public bool IsError()
        {
            return this._IsError;
        }

        /// <summary>
        /// Método que se encaga de obtener el mensaje de error
        /// </summary>
        /// <returns>Retorna el mensaje de error</returns>
        public string GetErrorMessage()
        {
            return this._ErrorMessage;
        }
        #endregion
    }
}
